package homeword;

/**
 * 字符串旋转算法实现类
 * 
 * 问题描述：
 * 给定两个字符串 A 和 B，判断是否可以通过旋转操作将字符串 A 转换成字符串 B。
 * 旋转操作定义：将字符串最左边的字符移动到最右边。
 * 
 * 示例：
 * 输入：A = "abcde"
 * 一次旋转后：A = "bcdea"
 * 
 * 判断条件：
 * - 如果通过若干次旋转操作后，A 能变成 B，返回 true
 * - 如果无法通过旋转操作匹配，返回 false
 * 
 * @author MR
 * @version 1.1
 */
public class adjustString {
    /**
     * 主方法：演示字符串旋转的两种实现方式
     * 
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 测试字符串
        String A = "abcde";
        String B = "bcdea"; // 期望得到的旋转结果
        
        // 1.使用substring方法实现字符串旋转
        String result1 = result(A);
        System.out.println("使用substring方法旋转后：" + result1);
        
        // 2.使用数组方法实现字符串旋转
        String result2 = array(A);
        System.out.println("使用数组方法旋转后：" + result2);
        
        // 验证旋转结果
        System.out.println("是否匹配目标字符串：" + result1.equals(B));
    }
    /**
     * 使用substring方法实现字符串旋转
     * 
     * 实现思路：
     * 1. 使用substring(0,1)获取第一个字符
     * 2. 使用substring(1)获取剩余字符串
     * 3. 将剩余字符串与第一个字符拼接，完成旋转
     * 
     * @param A 待旋转的字符串
     * @return 旋转后的字符串
     */
    public static String result(String A) {
        String first = A.substring(0, 1);  // 获取第一个字符
        String end = A.substring(1);       // 获取剩余字符串
        A = end + first;                   // 拼接完成旋转
        return A;
    }
    /**
     * 使用字符数组方法实现字符串旋转
     * 
     * 实现思路：
     * 1. 将字符串转换为字符数组
     * 2. 保存第一个字符
     * 3. 将后面的字符依次向前移动一位
     * 4. 将第一个字符放到最后
     * 5. 将字符数组转换回字符串
     * 
     * 时间复杂度：O(n)，其中n为字符串长度
     * 空间复杂度：O(n)，需要创建一个字符数组
     * 
     * @param A 待旋转的字符串
     * @return 旋转后的字符串
     */
    public static String array(String A) {
        char[] a = A.toCharArray();     // 将字符串转换为字符数组
        char first = a[0];              // 保存第一个字符
        
        // 将后面的字符依次向前移动一位
        for (int i = 1; i < a.length; i++) {
            a[i-1] = a[i];
        }
        
        a[a.length-1] = first;         // 将第一个字符放到最后
        A = new String(a);             // 将字符数组转换回字符串
        return A;
    }
}
